AWS Security Hub [Config.1] カスタムロールの検出をAWS CLIで一括抑制する

AWS Security Hub [Config.1] カスタムロールの検出をAWS CLIで一括抑制する

Clock Icon2024.12.05

はじめに

AWS事業本部の梶原です。

AWS Security Hubの[Config.1]コントロールにおいて、カスタムロールを使用している場合に検出される警告の抑制を行う機会があり、複数リージョンでの一括確認と抑制設定を効率的に行うためのスクリプトをご案内します

変更内容と影響

Config.1コントロールの評価項目

[Config.1]コントロールは、以下の3つの観点で評価されます

  1. AWS Config(レコーダー)が有効化されているか
  2. 必要なリソースタイプの記録が設定されているか
  3. AWS Configのサービスリンクロール(AWSServiceRoleForConfig)が設定されているか

影響

カスタムロールを使用している環境では、3番目の評価項目により、コントロールがFAILED状態となり、現在、重要度がCRITICALとして検出されます。

Configレコーダーの設定をカスタマイズしている場合、特定のサービスリンクロールに設定する必要がありますが、
この検出は、パラメータ設定により抑制することが可能ですので、抑制したいと思います。

パラメータ設定の影響は、3.の検出のみであり、2.必要なリソースタイプの記録が設定されているかが検出されている場合はロールに対して必要なアクションを付与するまた、記録するリソースタイプの変更などの対応が必要になります。

現状確認用スクリプト

以下のスクリプトで全リージョンの設定状況を確認できます
なお、SecurityHubが有効でないリージョンはスキップしています。

#!/bin/bash

# エラーハンドリングの設定
set -e

# 全リージョンのリストを取得
regions=$(aws ec2 describe-regions --query 'Regions[].RegionName' --output text)

echo "AWS Security Hub [Config.1] Service-Linked Role Check Status"
echo "========================================================="
echo "Timestamp: $(date)"
echo

for region in $regions; do
    echo "Region: $region"
    echo "----------------------------------------"

    # Config Recorder Status
    status=$(aws configservice describe-configuration-recorder-status \
        --region "$region" \
        --query 'ConfigurationRecordersStatus[0].recording' \
        --output text 2>/dev/null || echo "NONE")
    echo "Config Recorder Status: $status"

    # Current Config Role
    role=$(aws configservice describe-configuration-recorders \
        --region "$region" \
        --query 'ConfigurationRecorders[0].roleARN' \
        --output text 2>/dev/null || echo "NONE")
    echo "Current Config Role: $role"

    # Security Hub Parameter
    echo -n "Config.1 Parameter: "
    if aws securityhub describe-hub --region "$region" >/dev/null 2>&1; then
        aws securityhub batch-get-security-controls \
            --security-control-ids '["Config.1"]' \
            --region "$region" \
            --query "SecurityControls[0].Parameters.includeConfigServiceLinkedRoleCheck | {Type: ValueType, Value: Value.Boolean}" \
            --output json | jq -c '.' 2>/dev/null || echo "Error getting parameter"
    else
        echo "Security Hub not enabled"
    fi

    echo "----------------------------------------"
    echo
done

一括抑制設定スクリプト

以下のスクリプトで全リージョンの設定を一括でパラメーターを更新できます
なお、SecurityHubが有効でないリージョンはスキップしています。

#!/bin/bash

# エラーハンドリングの設定
set -e

# 全リージョンのリストを取得
regions=$(aws ec2 describe-regions --query 'Regions[].RegionName' --output text)

echo "AWS Security Hub [Config.1] Service-Linked Role Parameter Update"
echo "============================================================="
echo "Timestamp: $(date)"
echo

# 実行確認
read -p "This will update Config.1 parameter in all regions. Continue? (y/N): " confirm
if [[ ! "$confirm" =~ ^[yY]$ ]]; then
    echo "Operation cancelled"
    exit 1
fi

for region in $regions; do
    echo "Region: $region"
    echo "----------------------------------------"

    # Security Hub Parameter Update
    if aws securityhub describe-hub --region "$region" >/dev/null 2>&1; then
        # 更新前の値を取得
        echo -n "Before: "
        aws securityhub batch-get-security-controls \
            --security-control-ids '["Config.1"]' \
            --region "$region" \
            --query "SecurityControls[0].Parameters.includeConfigServiceLinkedRoleCheck | {Type: ValueType, Value: Value.Boolean}" \
            --output json | jq -c '.'

        # パラメータを更新
        aws securityhub update-security-control \
            --security-control-id "Config.1" \
            --parameters '{"includeConfigServiceLinkedRoleCheck": {"ValueType": "CUSTOM", "Value": {"Boolean": false}}}' \
            --last-update-reason "Suppress service-linked role check" \
            --region "$region"

        # 更新後の値を確認
        echo -n "After: "
        aws securityhub batch-get-security-controls \
            --security-control-ids '["Config.1"]' \
            --region "$region" \
            --query "SecurityControls[0].Parameters.includeConfigServiceLinkedRoleCheck | {Type: ValueType, Value: Value.Boolean}" \
            --output json | jq -c '.'

        echo "Status: Updated"
    else
        echo "Status: Security Hub not enabled"
    fi

    echo "----------------------------------------"
    echo
done

実行時の注意事項

CloudShell での実行を想定しています

1. 必要なIAM権限

以下の権限が必要です:

  • configservice:DescribeConfigurationRecorders
  • configservice:DescribeConfigurationRecorderStatus
  • securityhub:DescribeHub
  • securityhub:BatchGetSecurityControls
  • securityhub:UpdateSecurityControl
  • ec2:DescribeRegions

2. 事前準備

CloudShell での実行を想定しています

3. 実行手順と出力例

# 1. スクリプトに実行権限を付与
chmod +x check_config1.sh
chmod +x update_config1.sh

# 2. 現状確認の実行
./check_config1.sh

現状確認の出力例:

AWS Security Hub [Config.1] Service-Linked Role Check Status
=========================================================
Timestamp: Wed Jan 24 15:30:00 JST 2024

Region: ap-northeast-1
----------------------------------------
Config Recorder Status: true
Current Config Role: arn:aws:iam::123456789012:role/cm-config-role-all-regions
Config.1 Parameter: {"Type":"DEFAULT","Value":true}
----------------------------------------

Region: us-east-1
----------------------------------------
Config Recorder Status: true
Current Config Role: arn:aws:iam::123456789012:role/cm-config-role-all-regions
Config.1 Parameter: {"Type":"DEFAULT","Value":true}
----------------------------------------

Region: eu-west-1
----------------------------------------
Config Recorder Status: true
Current Config Role: arn:aws:iam::123456789012:role/cm-config-role-all-regions
Config.1 Parameter: Security Hub not enabled
----------------------------------------
# 3. 更新スクリプトの実行
./update_config1.sh

更新スクリプトの出力例:

AWS Security Hub [Config.1] Service-Linked Role Parameter Update
=============================================================
Timestamp: Wed Jan 24 15:35:00 JST 2024

This will update Config.1 parameter in all regions. Continue? (y/N): y

Region: ap-northeast-1
----------------------------------------
Before: {"Type":"DEFAULT","Value":true}
After: {"Type":"CUSTOM","Value":false}
Status: Updated
----------------------------------------

Region: us-east-1
----------------------------------------
Before: {"Type":"DEFAULT","Value":true}
After: {"Type":"CUSTOM","Value":false}
Status: Updated
----------------------------------------

Region: eu-west-1
----------------------------------------
Status: Security Hub not enabled
----------------------------------------

Security Hub での抑制状態確認

設定したパラメータでの検出はすぐに有効になりませんので、1日程度、検出状況を確認し、抑制されるか確認してください。

まとめ

各リージョンでSecurityHubが有効な場合、手作業で実施した場合、設定もれ、また更新間違いなどが発生しがちですので、スクリプトで対応しました。

コンソールから実施する場合は、以下のエントリーをご参考ください

参考リンク

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.